#ifndef OPENURLFILECOMMAND_H
#define OPENURLFILECOMMAND_H

#include "base_command.h"
#include <QJsonObject>
#include <QString>

class QNetworkReply;

// OpenUrlFileCommand 命令类
// 负责执行 openurlfile 命令，包括插入数据库记录和调用 openFileByURL
class OpenUrlFileCommand : public BaseCommand
{
    Q_OBJECT

public:
    explicit OpenUrlFileCommand(QObject *parent = nullptr);
    
    // 设置 BackendService 实例（重写基类方法以连接信号）
    void setBackendService(BackendService *backendService);
    
    // 设置 QNetworkAccessManager 实例（重写基类方法以连接信号）
    void setNetworkAccessManager(QNetworkAccessManager *networkManager);
    
    // 执行命令
    // 参数：jsonObj - 包含 downloadurl、commiturl、accesstoken 的 JSON 对象
    // 返回：执行是否成功
    bool execute(const QJsonObject &jsonObj);

private slots:
    // 处理网络请求完成信号
    void onNetworkReplyFinished(QNetworkReply *reply);
    // 处理文件打开完成信号（用于检测下载失败）
    void onOpenFileCompleted(int resultCode, const QString &message);

private:
    // 通过URL下载并打开文件
    void openFileByURL(const QString &downloadUrl, const QString &accessToken);
    
    // 处理文件下载响应
    void handleDownloadFileByURLResponse(QNetworkReply *reply);
    
    // 打开文件
    void openFile(const QString &filePath);
    
    // 从 BackendService 获取 accessToken（如果未提供）
    QString getAccessToken(const QString &providedToken);
    
    // 处理文件下载完成后的业务逻辑（插入 commitfiletourl 指令、更新状态等）
    void onFileDownloadedByURL(const QString &downloadUrl, const QString &localFilePath);

private:
    QString m_commitUrl;  // 保存 commitUrl，用于文件下载完成后插入 commitfiletourl 指令
    QString m_accessToken;  // 保存 accessToken，用于文件下载完成后插入 commitfiletourl 指令
    QString m_currentDownloadUrl;  // 保存当前正在处理的下载URL，用于识别失败
};

#endif // OPENURLFILECOMMAND_H

